package com.dcyao.musicserve.controller;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

import com.dcyao.musicserve.common.R;
import com.dcyao.musicserve.domain.StaffList;
import com.dcyao.musicserve.domain.dto.StaffListDTO;
import com.dcyao.musicserve.mapper.StaffListMapper;
import com.dcyao.musicserve.service.StaffListService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;

/**
 * @author 徐双
 * @ClassName StaffListController
 * @date 2023-01-21 16:07
 * @Description:乐谱集
 * @Version:1.0
 */

@RestController
public class StaffListController {
    @Value("${files.upload.path}")
    private String fileUploadPath;
    @Autowired
    private StaffListService staffListService;
    @Autowired
    private StaffListMapper staffListMapper;

    /**
     * 分页查询所有的乐谱集
     *
     * @return
     */
    @GetMapping("/page")
    public R findUserAll(@RequestParam(defaultValue = "1") Integer pageNum,
                         @RequestParam(defaultValue = "10") Integer pageSize,
                         @RequestParam(defaultValue = "") String style) {
        return staffListService.findPage(pageNum, pageSize, style);
    }

    /**
     * 编辑
     *
     * @param updateRequest
     * @return
     */
    @PostMapping("/update")
    public R updateStaffMsg(@RequestBody StaffListDTO updateRequest){
        return staffListService.updateStaffList(updateRequest);
    }

    /**
     * 删除
     *
     * @param id
     * @return
     */
    @GetMapping("/delete")
    public R deleteStaff(@RequestParam int id) {
        return staffListService.deleteStaffList(id);
    }


    /**
     * 批量删除
     *
     * @param ids
     * @return
     */
    @PostMapping("/delBatch")
    public R deleteBathIds(@RequestBody List<Integer> ids) {
        return staffListService.deleteBathIds(ids);
    }

    /**
     * 更新封面
     *
     * @param file
     * @param id
     * @return
     * @throws IOException
     */
    @PostMapping("/upload")
    public String upload(@RequestParam MultipartFile file, @RequestParam Integer id) throws IOException {
        //获取文件原名
        String originalFilename = file.getOriginalFilename();
        //获取文件类型，即后缀名
        String type = FileUtil.extName(originalFilename);

        //先存储到磁盘
        File uploadParentFile = new File(fileUploadPath);
        //判断配置的文件目录是否存在，若不存在则创建一个新的文件目录
        if (!uploadParentFile.exists()) {
            uploadParentFile.mkdirs();
        }
        //定义一个文件唯一的标识码
        String uuid = IdUtil.fastSimpleUUID();
        //文件标识位
        String fileUUID = uuid + StrUtil.DOT + type;
        File uploadFile = new File(fileUploadPath + fileUUID);
        String url;
        //上传文件到磁盘
        file.transferTo(uploadFile);
        //获取文件的md5
        String md5 = SecureUtil.md5(uploadFile);
        //从数据库查询是否存在相同的记录
        StaffList dbFiles = getFileByMd5(md5);
        if (dbFiles != null) {
            url = dbFiles.getPicture();
            //由于文件已存在，所以删除刚才上传的重复文件
            uploadFile.delete();
        } else {
            //数据若不存在重复文件，则不删除刚才上传的文件
            url = "http://localhost:8888/" + fileUUID;
        }

        //存储数据库
        StaffList sysFile = new StaffList();
        sysFile.setId(id);
        sysFile.setPicture(url);
        staffListService.saveOrUpdate(sysFile);
        return url;
    }

    /**
     * 新增包括图片
     *
     * @param file
     * @return
     * @throws IOException
     */
    @PostMapping("/add")
    public R uploads(@RequestParam MultipartFile file, @RequestParam String title, @RequestParam String introduction, @RequestParam String style) throws IOException {
        //获取文件原名
        String originalFilename = file.getOriginalFilename();
        //获取文件类型，即后缀名
        String type = FileUtil.extName(originalFilename);
        //先存储到磁盘
        File uploadParentFile = new File(fileUploadPath);
        //判断配置的文件目录是否存在，若不存在则创建一个新的文件目录
        if (!uploadParentFile.exists()) {
            uploadParentFile.mkdirs();
        }
        //定义一个文件唯一的标识码
        String uuid = IdUtil.fastSimpleUUID();
        //文件标识位
        String fileUUID = uuid + StrUtil.DOT + type;
        File uploadFile = new File(fileUploadPath + fileUUID);
        String url;
        //上传文件到磁盘
        file.transferTo(uploadFile);
        //获取文件的md5
        String md5 = SecureUtil.md5(uploadFile);
        //从数据库查询是否存在相同的记录
        StaffList dbFiles = getFileByMd5(md5);
        if (dbFiles != null) {
            url = dbFiles.getPicture();
            //由于文件已存在，所以删除刚才上传的重复文件
            uploadFile.delete();
        } else {
            //数据若不存在重复文件，则不删除刚才上传的文件
            url = "http://localhost:8888/" + fileUUID;
        }
        //存储数据库
        StaffList staffList = new StaffList();
        staffList.setPicture(url);
        staffList.setIntroduction(introduction);
        staffList.setStyle(style);
        staffList.setTitle(title);
        return staffListService.addStaffList(staffList);
    }

    /**
     * 通过文件的md5查询文件
     *
     * @param md5
     * @return
     */
    private StaffList getFileByMd5(String md5) {
        //查询文件的md5是否存在
        QueryWrapper<StaffList> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("md5", md5);
        List<StaffList> fileList = staffListMapper.selectList(queryWrapper);
        return fileList.size() == 0 ? null : fileList.get(0);
    }


    /**
     * 查询乐谱总数
     *
     * @return
     */
    @GetMapping("/findStaffLists")
    public int findStaffLists() {
        return staffListService.staffListCount();
    }


    /**
     * 查询所有乐谱集
     *
     * @return
     */
    @GetMapping("/staffListAll")
    public R allUser() {
        return staffListService.allStaffList();
    }

    /**
     * 模糊查询乐谱集名
     *
     * @param title
     * @return
     */
    @GetMapping("/likeStaffListName")
    public R likeStaffListName(@RequestParam String title) {
        return staffListService.likeStaffListName(title);
    }

    /**
     * 根据风格查询对应的乐谱集（乐谱集有数据）
     *
     * @param style
     * @return
     */
    @GetMapping("/staffListStyle")
    public R StaffListStyle(@RequestParam String style) {
        return staffListService.StaffListStyle(style);
    }

    /**
     * 根据风格查询对应的乐谱集
     *
     * @param style
     * @return
     */
    @GetMapping("/staffListStyleAll")
    public R StaffListStyleAll(@RequestParam String style) {
        return staffListService.StaffListStyleAll(style);
    }

    /**
     * 根据风格查询对应的乐谱集
     *
     * @return
     */
    @GetMapping("/StyleStaff")
    public R StyleStaff() {
        return staffListService.StyleStaff();
    }

    /**
     * 查询所以的风格
     *
     * @return
     */
    @GetMapping("/staffStyle")
    public R StaffStyle() {
        return staffListService.StaffStyle();
    }

    /**
     * 文件下载：下载路径 http://localhost:8888/admin/{fileUUID}
     *
     * @param fileUUID
     * @param response
     */
    @GetMapping("/{fileUUID}")
    public void download(@PathVariable String fileUUID, HttpServletResponse response) throws IOException {
        //根据文件的唯一标识码获取文件
        File uploadFile = new File(fileUploadPath + fileUUID);
        //设置输出流的格式
        ServletOutputStream os = response.getOutputStream();
        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileUUID, "UTF-8"));
        response.setContentType("application/octet-stream");
        //读取文件的字节流
        os.write(FileUtil.readBytes(uploadFile));
        os.flush();
        os.close();
    }
}
